Dataset yang digunakan dalam artikel ini adalah data pembelian tiap klien pada industri FMCG. Dataset diambil dari UCI ML Repository. Artikel ini akan membahas analisis pengelompokan menggunakan K-Means Clustering dan mereduksi dimensi pada dataset menggunakan metode Principal Component Analysis (PCA). Melalui analisis ini, ingin dievaluasi kemungkinan melakukan clustering untuk menghasilkan label baru pada dataset dan kemungkinan pereduksian dimensi menggunakan PCA. Selain itu, akan mdianalisis pola data untuk mendapatkan insight dengan menggabungkan PCA dan clustering.
Melakukan read pada dataset, lalu menampilkan 6 data pertama.
wholesale <- read.csv("wholesale.csv")
head(wholesale)#> Channel Region Fresh Milk Grocery Frozen Detergents_Paper Delicassen
#> 1 2 3 12669 9656 7561 214 2674 1338
#> 2 2 3 7057 9810 9568 1762 3293 1776
#> 3 2 3 6353 8808 7684 2405 3516 7844
#> 4 1 3 13265 1196 4221 6404 507 1788
#> 5 2 3 22615 5410 7198 3915 1777 5185
#> 6 2 3 9413 8259 5126 666 1795 1451
Menampilkan struktur dari dataset, termasuk di dalamnya tipe tiap kolomnya.
library(tidyverse)
glimpse(wholesale)#> Rows: 440
#> Columns: 8
#> $ Channel <int> 2, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 2,...
#> $ Region <int> 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,...
#> $ Fresh <int> 12669, 7057, 6353, 13265, 22615, 9413, 12126, 7579...
#> $ Milk <int> 9656, 9810, 8808, 1196, 5410, 8259, 3199, 4956, 36...
#> $ Grocery <int> 7561, 9568, 7684, 4221, 7198, 5126, 6975, 9426, 61...
#> $ Frozen <int> 214, 1762, 2405, 6404, 3915, 666, 480, 1669, 425, ...
#> $ Detergents_Paper <int> 2674, 3293, 3516, 507, 1777, 1795, 3140, 3321, 171...
#> $ Delicassen <int> 1338, 1776, 7844, 1788, 5185, 1451, 545, 2566, 750...
Deskripsi dari dataset sebagai berikut:
Variabel Channel belum tepat tipe datanya, sehingga akan diubah tipenya menjadi factor/kategorik. Selain itu, variabel Region akan diremove karena tidak digunakan dalam analisis.
wholesale <- wholesale %>%
select(-Region) %>%
mutate(Channel = as.factor(Channel))Selanjutnya cek keberadaan missing value pada dataset.
anyNA(wholesale)#> [1] FALSE
Hasil di atas menunjukkan bahwa tidak terdapat missing value pada dataset.
Bagian EDA, akan dilakukan eksplorasi pada data untuk mengetahui karakteristik secara umum dari dataset. Dilakukan pembuatan box plot antara variabel kategorik yaitu Channel terhadap setiap variabel numerik.
library(cowplot)
p1 <- ggplot(wholesale, aes(Channel, Fresh, fill = Channel)) +
geom_boxplot(show.legend = F) +
theme_minimal() + labs(title = "Fresh")
p2 <- ggplot(wholesale, aes(Channel, Milk, fill = Channel)) +
geom_boxplot(show.legend = F) +
theme_minimal() + labs(title = "Milk")
p3 <- ggplot(wholesale, aes(Channel, Grocery, fill = Channel)) +
geom_boxplot(show.legend = F) +
theme_minimal() + labs(title = "Grocery")
p4 <- ggplot(wholesale, aes(Channel, Frozen, fill = Channel)) +
geom_boxplot(show.legend = F) +
theme_minimal() + labs(title = "Frozen")
p5 <- ggplot(wholesale, aes(Channel, Detergents_Paper, fill = Channel)) +
geom_boxplot(show.legend = F) +
theme_minimal() + labs(title = "Detergents Paper")
p6 <- ggplot(wholesale, aes(Channel, Delicassen, fill = Channel)) +
geom_boxplot(show.legend = F) +
theme_minimal() + labs(title = "Delicassen")
plot_grid(p1, p2, p3, p4, p5, p6)Berdasarkan box plot di atas, Channel dengan kode 2 yaitu klien Retail, cenderung nilai pembeliannya lebih tinggi daripada Channel dengan kode 1 yaitu Horeca. Guna menemukan pola yang lebih menarik dan belum ditemukan pada dataset, akan digunakan metode clustering menggunakan K-Means.
Selanjutnya akan dilihat apakah ada korelasi yang tinggi antar variabel numerik. Korelasi yang kuat dalam beberapa variabel menyiratkan bahwa dapat dilakukan pengurangan dimensi atau jumlah fitur menggunakan metode PCA.
library(GGally)
ggcorr(wholesale, low = "navy", high = "darkred", hjust = 1, layout.exp = 2, label = T, label_size = 2.9)Hasil korelasi di atas menunjukkan bahwa terdapat korelasi yang kuat pada beberapa variabel. Variabel-variabel tersebut adalah Milk, Grocery, dan Detergents_Paper. Hasil ini menunjukkan bahwa dataset ini memiliki multikolinieritas dan mungkin tidak cocok untuk berbagai algoritma klasifikasi (yang mengasumsikan non-multikolinieritas).
PCA dapat dilakukan agar data ini menghasilkan data non-multikolinieritas, juga mengurangi dimensi data dan menyimpan informasi sebanyak mungkin. Hasil analisis ini dapat dimanfaatkan lebih lanjut untuk tujuan klasifikasi dengan komputasi yang lebih rendah.
Dilakukan standarisasi pada dataset, hal agar data memiliki range yang sama. Ini dilakukan karena variabel-variabel dalam dataset memiliki satuan dan range yang berbeda.
wholesale_z <- scale(wholesale[,-1])Clustering adalah pengelompokan data berdasarkan karakteristiknya. Clustering bertujuan untuk menghasilkan cluster dimana:
Langkah dalam clustering, pertama adalah menentukan banyak cluster yang optimal. Metode clustering, yang harus dilakukan adalah meminimalkan jumlah kuadrat dalam cluster. Ini berarti jarak antar observasi dalam cluster yang sama minimal. Untuk mendapatkan banyak cluster yang optimal dapat digunakan 3 metode yaitu metode elbow, metode silhouette, dan statistik gap. kemudian menentukan banyak cluster berdasarkan voting mayoritas.
Aturan dalam menggunakan metode elbow untuk mengetahui banyak cluster yang optimal adalah memilih banyak cluster di area “bend of an elbow”, dimana grafik total within sum of squares mulai stagnan seiring dengan bertambahnya jumlah cluster.
library(factoextra)
fviz_nbclust(x = wholesale_z, FUNcluster = kmeans, method = "wss", k.max = 15) +
labs(subtitle = "Elbow method")Berdasarkan grafik di atas, diketahui bahwa 4 cluster sudah cukup baik karena tidak ada penurunan yang signifikan dalam total within sum of squares pada jumlah cluster yang lebih banyak. Metode ini mungkin belum cukup baik dimana banyak cluster optimal kurang jelas.
Metode silhouette mengukur koefisien silhouette, dengan menghitung rata-rata jarak intra-cluster dan rata-rata jarak cluster terdekat untuk setiap pengamatan. Banyak cluster yang optimal ditentukan dengan memilih banyak cluster dengan skor silhouette tertinggi.
fviz_nbclust(wholesale_z, kmeans, "silhouette", k.max = 15) +
labs(subtitle = "Silhouette method")Berdasarkan metode silhouette, banyak cluster dengan skor tertinggi dianggap sebagai k-cluster yang optimal. Grafik di atas menunjukkan bahwa banyak cluster yang optimal adalah 2.
Statistik gap bekerja dengan cara membandingkan total dalam variasi intra-cluster untuk nilai k yang berbeda dengan nilai yang diharapkan di bawah distribusi referensi nol dari data. Perkiraan cluster optimal akan menjadi nilai yang memaksimalkan statistik gap.
fviz_nbclust(wholesale_z, kmeans, "gap_stat", k.max = 15) +
labs(subtitle = "Gap Statistic method")Berdasarkan metode statistik gap, k yang optimal adalah 4.
Dua dari tiga metode menunjukkan bahwa k = 4 adalah banyak cluster yang optimal.
K-means adalah centroid-based clustering algorithms. Centroid sendiri berarti titik pusat. K-means merupakan proses yang berulang dari:
set.seed(123)
km <- kmeans(wholesale_z, centers = 4)
km#> K-means clustering with 4 clusters of sizes 63, 96, 12, 269
#>
#> Cluster means:
#> Fresh Milk Grocery Frozen Detergents_Paper Delicassen
#> 1 1.6570840 -0.1082488 -0.2174555 1.1022182 -0.4041420 0.33264630
#> 2 -0.5132347 0.6448681 0.8972434 -0.3402509 0.9056302 0.04748801
#> 3 0.5196448 4.0411531 3.7894636 0.6071610 3.8233494 2.23382727
#> 4 -0.2281097 -0.3850613 -0.4383243 -0.1637978 -0.3991069 -0.19450369
#>
#> Clustering vector:
#> [1] 4 2 2 4 1 4 4 4 4 2 2 4 1 2 2 4 2 4 4 4 4 4 1 3 2 4 4 4 2 1 4 4 4 1 4 2 1
#> [38] 2 2 1 1 4 2 2 2 2 2 3 2 2 4 4 1 2 4 4 3 2 4 4 4 3 4 2 4 3 4 2 4 4 1 1 4 1
#> [75] 4 4 4 2 4 4 4 2 2 4 4 3 3 1 4 1 4 4 3 1 2 4 4 4 4 4 2 2 4 1 4 4 2 2 4 2 4
#> [112] 2 1 4 4 4 4 4 4 4 4 4 4 4 1 1 1 4 4 1 4 4 4 4 4 4 4 4 4 4 4 1 1 4 4 2 4 4
#> [149] 4 1 4 4 4 4 4 2 2 4 2 2 2 4 4 2 4 2 2 4 4 4 2 2 4 2 4 2 1 4 4 4 4 1 2 3 4
#> [186] 4 4 4 2 2 4 4 4 2 4 1 1 2 4 4 2 2 1 4 4 2 4 4 4 2 4 3 4 4 2 2 2 4 2 4 4 2
#> [223] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 1 1 4 4 4 2 2 4 4 4 4 4 3 4 1 2 1 4 4 1
#> [260] 1 4 4 4 4 2 2 2 4 2 4 4 4 4 1 4 4 1 1 4 4 4 4 1 1 1 1 4 4 4 1 4 4 4 2 4 4
#> [297] 4 4 4 4 4 2 2 2 2 2 2 4 4 2 4 1 2 4 4 2 4 4 4 2 4 4 4 4 4 1 4 4 4 4 4 2 4
#> [334] 3 1 1 4 4 4 4 2 2 4 2 4 4 2 1 4 2 4 2 4 2 4 4 4 2 4 4 4 4 4 4 4 4 4 4 4 4
#> [371] 1 1 4 4 4 4 2 1 4 4 1 1 1 4 2 4 4 4 4 4 4 4 4 1 4 4 2 4 4 4 4 1 4 4 4 4 1
#> [408] 2 4 4 4 4 4 1 4 4 2 4 2 4 2 4 4 4 4 1 2 1 4 4 4 1 4 4 4 1 1 2 4 4
#>
#> Within cluster sum of squares by cluster:
#> [1] 440.1481 188.1085 490.5957 235.0199
#> (between_SS / total_SS = 48.6 %)
#>
#> Available components:
#>
#> [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
#> [6] "betweenss" "size" "iter" "ifault"
Perbandingan antara jumlah jarak kuadrat terbobot dari tiap centroid ke rata-rata global (between_SS) dengan jumlah jarak kuadrat dari tiap observasi ke rata-rata global (total_SS) adalah 48,6%, artinya hampir setengah penjumlahan jarak kuadrat berasal dari jarak antar klaster. Dengan demikian, dapat disimpulkan bahwa data terkluster dengan cukup baik karena pengamatan dalam cluster yang sama memiliki jarak atau variasi yang cukup kecil. Jumlah anggota pada setiap cluster tidak merata.
wholesale$cluster <- as.factor(km$cluster)
head(wholesale)#> Channel Fresh Milk Grocery Frozen Detergents_Paper Delicassen cluster
#> 1 2 12669 9656 7561 214 2674 1338 4
#> 2 2 7057 9810 9568 1762 3293 1776 2
#> 3 2 6353 8808 7684 2405 3516 7844 2
#> 4 1 13265 1196 4221 6404 507 1788 4
#> 5 2 22615 5410 7198 3915 1777 5185 1
#> 6 2 9413 8259 5126 666 1795 1451 4
K-means clustering yang dilakukan menggunakan k = 4, hal ini berbeda dengan segmentasi dari dataset awal yang hanya 2 yaitu Retail dan Horeca. Kemudian temuan menarik yang bisa digali dari analisis cluster dapat dilakukan menggunakan nilai centroid pada masing-masing cluster.
wholesale %>%
group_by(cluster) %>%
summarise_if(is.numeric, "mean") %>%
mutate_if(is.numeric,
.funs = "round",
digits = 2)#> # A tibble: 4 x 7
#> cluster Fresh Milk Grocery Frozen Detergents_Paper Delicassen
#> <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 1 32958. 4997. 5885. 8423. 955. 2463.
#> 2 2 5509. 10556. 16478. 1420. 7199. 1659.
#> 3 3 18572. 35622. 43963. 6020. 21111. 7824.
#> 4 4 9115. 2954. 3786. 2277. 979. 976.
Selain menggunakan tabel, centroid pada masing-masing cluster bisa dilihat visualisasinya menggunakan radar plot.
library(ggradar)
library(scales)
dat_radar <- wholesale %>%
group_by(cluster) %>%
summarise_if(is.numeric, "mean") %>%
rename(group = cluster) %>%
mutate(group = as.character(group)) %>%
mutate_at(vars(-group),
funs(rescale))
ggradar(dat_radar,
grid.label.size = 3,
axis.label.size = 3,
group.point.size = 4,
group.line.width = 1.5,
legend.text.size= 8)Beberapa hal menarik yang bisa didapatkan dari centroid diantaranya:
Cluster 1: cluster ini memiliki jumlah pembelian produk segar dan es/beku yang tertinggi, namun rendah dalam jumlah pembelian produk detergen dan kertas.Cluster 2: cluster ini memiliki jumlah pembelian yang sedang pada produk susu, grocery, detergen dan kertas serta delicatessen dan rendah pada jumlah pembelian produk yang lain.Cluster 3: cluster ini memiliki jumlah pembelian produk susu, gorcery, detergen dan kertas, serta produk delicatessen (berkualitas tinggi) yang tertinggi dan jumlah pembelian produk yang lain juga cukup tinggi.Cluster 4: cluster ini memiliki jumlah pembelian terendah pada produk susu, grocery dan delicatessen serta cukup rendah pada jumlah pembelian produk yang lain.Principal component analysis (PCA) adalah prosedur statistik yang menggunakan transformasi ortogonal untuk mengubah serangkaian pengamatan dari variabel yang mungkin berkorelasi menjadi satu set nilai variabel yang tidak berkorelasi linier yang disebut principal component. Transformasi ini didefinisikan sedemikian rupa sehingga komponen utama pertama memiliki kemungkinan variansi terbesar, ini berarti menyumbang sebanyak mungkin variabilitas dalam data, dan setiap komponen berikutnya pada gilirannya memiliki variansi setinggi mungkin di bawah batasan tersebut yang ortogonal dengan komponen sebelumnya. Vektor yang dihasilkan adalah himpunan basis ortogonal yang tidak berkorelasi yang masing-masing merupakan kombinasi linier dari variabel dan berisi n pengamatan. PCA sensitif terhadap penskalaan relatif dari variabel asli.
Pembuatan PCA dari dataset wholesale. Lalu akan dilihat nilai eigen dan persentase variansi yang dijelaskan oleh masing-masing dimensi. Nilai eigen mengukur jumlah variasi yang dipertahankan oleh setiap komponen utama. Nilai eigen besar untuk PC pertama dan lebih kecil untuk PC berikutnya. Artinya, PC pertama sesuai dengan petunjuk dengan jumlah variasi maksimum dalam kumpulan data.
library(FactoMineR)
wholesale_pca <- PCA(wholesale,
scale.unit = T,
ncp = 6,
graph = F,
quali.sup = c(1,8))
summary(wholesale_pca)#>
#> Call:
#> PCA(X = wholesale, scale.unit = T, ncp = 6, quali.sup = c(1,
#> 8), graph = F)
#>
#>
#> Eigenvalues
#> Dim.1 Dim.2 Dim.3 Dim.4 Dim.5 Dim.6
#> Variance 2.645 1.703 0.740 0.564 0.286 0.063
#> % of var. 44.083 28.376 12.334 9.396 4.761 1.050
#> Cumulative % of var. 44.083 72.459 84.794 94.189 98.950 100.000
#>
#> Individuals (the 10 first)
#> Dist Dim.1 ctr cos2 Dim.2 ctr cos2
#> 1 | 0.795 | 0.193 0.003 0.059 | -0.305 0.012 0.147 |
#> 2 | 0.753 | 0.434 0.016 0.333 | -0.328 0.014 0.190 |
#> 3 | 2.332 | 0.811 0.057 0.121 | 0.815 0.089 0.122 |
#> 4 | 1.133 | -0.779 0.052 0.472 | 0.653 0.057 0.332 |
#> 5 | 1.577 | 0.166 0.002 0.011 | 1.271 0.216 0.650 |
#> 6 | 0.736 | -0.156 0.002 0.045 | -0.295 0.012 0.161 |
#> 7 | 0.738 | -0.335 0.010 0.206 | -0.525 0.037 0.506 |
#> 8 | 0.623 | 0.141 0.002 0.051 | -0.231 0.007 0.137 |
#> 9 | 0.884 | -0.517 0.023 0.343 | -0.659 0.058 0.557 |
#> 10 | 1.782 | 1.592 0.218 0.799 | -0.741 0.073 0.173 |
#> Dim.3 ctr cos2
#> 1 0.141 0.006 0.031 |
#> 2 -0.319 0.031 0.179 |
#> 3 -1.523 0.713 0.427 |
#> 4 -0.163 0.008 0.021 |
#> 5 -0.066 0.001 0.002 |
#> 6 -0.148 0.007 0.040 |
#> 7 0.303 0.028 0.169 |
#> 8 -0.390 0.047 0.392 |
#> 9 -0.183 0.010 0.043 |
#> 10 -0.210 0.014 0.014 |
#>
#> Variables
#> Dim.1 ctr cos2 Dim.2 ctr cos2 Dim.3 ctr
#> Fresh | 0.070 0.184 0.005 | 0.689 27.871 0.475 | 0.699 65.976
#> Milk | 0.887 29.715 0.786 | 0.109 0.692 0.012 | -0.052 0.365
#> Grocery | 0.942 33.554 0.887 | -0.191 2.134 0.036 | 0.093 1.175
#> Frozen | 0.083 0.262 0.007 | 0.798 37.366 0.636 | -0.153 3.182
#> Detergents_Paper | 0.892 30.101 0.796 | -0.333 6.514 0.111 | 0.117 1.855
#> Delicassen | 0.404 6.184 0.164 | 0.658 25.422 0.433 | -0.451 27.448
#> cos2
#> Fresh 0.488 |
#> Milk 0.003 |
#> Grocery 0.009 |
#> Frozen 0.024 |
#> Detergents_Paper 0.014 |
#> Delicassen 0.203 |
#>
#> Supplementary categories
#> Dist Dim.1 cos2 v.test Dim.2 cos2 v.test
#> Channel_1 | 0.711 | -0.655 0.850 -12.227 | 0.274 0.149 6.383
#> Channel_2 | 1.491 | 1.375 0.850 12.227 | -0.576 0.149 -6.383
#> cluster_1 | 2.075 | -0.197 0.009 -1.036 | 1.844 0.790 12.106
#> cluster_2 | 1.558 | 1.342 0.742 9.134 | -0.764 0.241 -6.485
#> cluster_3 | 7.145 | 7.113 0.991 15.343 | 0.579 0.007 1.557
#> cluster_4 | 0.786 | -0.750 0.911 -12.121 | -0.185 0.055 -3.725
#> Dim.3 cos2 v.test
#> Channel_1 | 0.004 0.000 0.144 |
#> Channel_2 | -0.009 0.000 -0.144 |
#> cluster_1 | 0.904 0.190 9.001 |
#> cluster_2 | -0.200 0.016 -2.569 |
#> cluster_3 | -0.169 0.001 -0.691 |
#> cluster_4 | -0.133 0.029 -4.060 |
Melalui PCA, dapat dipertahankan beberapa komponen utama yang informatif (variansi kumulatif tinggi) dari dataset Wholesale untuk melakukan pengurangan/reduksi dimensi. Keuntungan dari hal ini adalah dapat mengurangi dimensi dataset sambil juga menyimpan informasi sebanyak mungkin.
fviz_eig(wholesale_pca, ncp = 6, addlabels = T, main = "Variance explained by each dimensions")Sekitar 44% varian dapat dijelaskan hanya dengan menggunakan dimensi pertama. Pada studi ini, akan disimpan sekitar 80% informasi dari dataset. Ini berati cukup dengan menggunakan 3 dimensi. Dengan demikian, pengurangan dimensi sebesar 50%. Selanjutnya dapat diekstrak nilai PC1-PC3 dari semua pengamatan dan memasukkannya ke dalam dataframe baru. Dataframe ini nantinya dapat dianalisis menggunakan teknik klasifikasi pada machine learning atau untuk tujuan yang lain.
wholesale_x <- data.frame(wholesale_pca$ind$coord[,1:3])
wholesale_xx <- cbind(wholesale_x, Channel = wholesale$Channel)
head(wholesale_xx)#> Dim.1 Dim.2 Dim.3 Channel
#> 1 0.1932905 -0.3051000 0.14087845 2
#> 2 0.4344199 -0.3284126 -0.31900662 2
#> 3 0.8111432 0.8150957 -1.52341562 2
#> 4 -0.7786478 0.6527537 -0.16301227 1
#> 5 0.1662873 1.2714337 -0.06627939 2
#> 6 -0.1561699 -0.2951410 -0.14761194 2
Individual observations map menunjukkan dimana masing-masing pengamatan diposisikan dalam PC1 dan PC2. Pada penggunaan 2 PC pertama, dapat dilihat bahwa ada banyak outlier di dataset. Analisis lebih lanjut dapat dilakukan untuk memeriksanya.
fviz_pca_ind(wholesale_pca,
habillage = 1,
addEllipses = T)Grafik di atas adalah individual observations map dari hasil PCA dengan pembagian kategori menggunakan Channel. Hasilnya menunjukkan bahwa sebagian besar observasi ditiap kategori memiliki nilai cos2 yang hampir sama, berada di range 0-5. cos2 atau nilai cosinus kuadrat sendiri menunjukkan pentingnya principal component untuk pengamatan tertentu yaitu vektor variabel asli, nilai cos2 dapat membantu menemukan komponen yang penting untuk menginterpretasikan pengamatan. Menggunakan 2 PC, sudah dapat mengakomodasi varian yang cukup besar, sekitar 70%.
fviz_pca_ind(wholesale_pca,
habillage = 8,
addEllipses = T)Grafik di atas adalah individual observations map dari hasil PCA dengan pembagian kategori menggunakan hasil cluster. Hasilnya menunjukkan bahwa cluster 1,2 dan 4 memiliki observasi yang berdekatan. Jika menggunakan 4 pembagian kategori, sedikit terdapat data outlier dibandingkan saat menggunakan 2 kategori. Pada cluster 3, terdiri atas lebih sedikit observasi jika dibandingkan cluster yang lain dan juga cluster ini memiliki variansi yang besar pada observasinya, terlihat dari besarnya ellips pada cluster ini.
Selanjutnya adalah mengenai variable factor map. Pada bagian sebelumnya, observasi diwakili oleh proyeksi, maka variabel diwakili oleh korelasinya. Semakin dekat suatu variabel dengan lingkaran korelasi, semakin baik untuk dapat direkonstruksi variabel ini dari dua PC pertama. Semakin dekat ke tengah plot suatu variabel, semakin kurang penting untuk dua PC pertama.
fviz_pca_var(wholesale_pca,
select.var = list(contrib = 6),
col.var = "contrib",
repel = T)Plot di atas menunjukkan bahwa variabel terletak di dalam lingkaran, artinya dibutuhkan lebih dari dua PC untuk merepresentasikan data dengan sempurna. Warna menunjukkan kontribusi masing-masing variabel. Besar kontribusi variabel dalam PC tertentu dinyatakan dalam persentase. Variabel yang berkorelasi dengan PC1 dan PC2 adalah yang paling penting dalam menjelaskan variabilitas dalam dataset. Variabel yang tidak berkorelasi dengan PC mana pun atau berkorelasi dengan dimensi terakhir adalah variabel dengan kontribusi rendah dan dapat dihapus untuk menyederhanakan analisis secara keseluruhan.
Variabel yang memberikan kontribusi tinggi pada PC1 adalah Grocery, detergents_Paper, dan Milk, sedangkan sisanya berkontribusi lebih terhadap PC2. Tidak terdapat variabel yang memiliki korelasi negatif baik pada PC1 maupun PC2.
PCA dapat diintegrasikan dengan hasil K-means Clustering untuk membantu memvisualisasikan dataset dalam dimensi yang lebih sedikit daripada fitur aslinya.
fviz_cluster(object = km, data = wholesale_z, labelsize = 0) +
theme_light()Pada visualisasi di atas, cluster terlihat sedikit berpotongan satu sama lain. Ini karena tidak memiliki cukup dimensi untuk mewakilinya. Seihngg dapat ditambahkan 1 dimensi lagi menggunakan plotly untuk melihat apakah cluster kita masih mengelompok.
library(plotly)
wholesale_xc <- cbind(wholesale_x, cluster = wholesale$cluster)
plot_ly(wholesale_xc, x = ~Dim.1, y = ~Dim.2, z = ~Dim.3,
color = ~cluster, colors = c("black", "red", "green", "blue")) %>%
add_markers() %>%
layout(scene = list(xaxis = list(title = "Dim.1"),
yaxis = list(title = "Dim.2"),
zaxis = list(title = "Dim.3")))Berdasarkan grafik 3 dimensi, K-Means Clustering sudah berhasil mengelompokkan dataset dengan baik. Cluster 3 terlihat berjauhan dengan kumpulan cluster yang lain. Kemudian ada satu data yang ekstrim, karena berjauhan dari kumpulan data yang lain.
Simpulan yang dapat diambil dari analisis K-Means Clustering dan PCA dalam artikel ini sebagai berikut: